home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 3
/
Amiga Format CD03 (1996-07-04)(Future Publishing)(GB)(Track 1 of 6)[!][issue 1996-08].iso
/
comms
/
netsoftware
/
grapevine.lha
/
Grapevine
/
irclink.sh
< prev
next >
Wrap
Linux/UNIX/POSIX Shell Script
|
1994-10-27
|
7KB
|
278 lines
#!/bin/sh
#
# execute this to create an "irclink" executable in the current
# directory for your UNIX system.
#
# defaults to "cc", change this if you must :-)
ccomp=cc
# Remove -s if you do not want to strip the binary
cflags=-s
cat > irclink-out.c << 'EOFIRCLINK'
/*
* irclink.c -- UNIX-side serial support for Grapevine
*
* define CF_SGTTY for sgtty systems
*/
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#ifdef AIX
#include <sys/select.h>
#endif
#ifdef CF_SGTTY
#include <sgtty.h>
#else
#include <termios.h>
#endif
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#ifndef INADDR_NONE
#define INADDR_NONE -1
#endif
#define BUFSIZE 32
#ifdef CF_SGTTY
#ifndef FREAD
#define FREAD 0x0001
#endif
#ifndef FWRITE
#define FWRITE 0x0002
#endif
struct sgttyb ostty, nstty;
struct tchars otchars, ntchars;
struct ltchars oltchars, nltchars;
int olmode, nlmode;
int inout = FREAD|FWRITE;
#else
struct termios temp_tios;
#endif
int temp;
int CleanUp( i )
int i;
{
if( temp )
{
#ifdef CF_SGTTY
(void)ioctl(0, (int)TIOCFLUSH, (char *)&inout);
(void)ioctl(0, (int)TIOCSETP, (char *)&ostty);
(void)ioctl(0, (int)TIOCSETC, (char *)&otchars);
(void)ioctl(0, (int)TIOCSLTC, (char *)&oltchars);
(void)ioctl(0, (int)TIOCLSET, (char *)&olmode);
#else
tcsetattr( 0, TCSANOW, &temp_tios );
#endif
}
fcntl( 0, F_SETFL, fcntl( 0, F_GETFL, 0 ) & ~O_NDELAY );
exit( 0 );
}
int HandleIO( fd ) /* Shuffle data between fd and stdin/stdout */
int fd;
{
int result, i;
char inbuf[BUFSIZE];
struct fd_set rd;
struct fd_set zer;
#ifndef CF_SGTTY
struct termios tios;
#endif
struct timeval timeout;
signal( SIGINT, (void *) CleanUp ); /* Clean up sockets when killed */
signal( SIGTSTP, (void *) CleanUp );
signal( SIGSEGV, (void *) CleanUp );
signal( SIGBUS, (void *) CleanUp );
signal( SIGQUIT, (void *) CleanUp );
signal( SIGKILL, (void *) CleanUp );
#ifdef CF_SGTTY
ioctl(0, (int)TIOCGETP, (char *)&ostty);
ioctl(0, (int)TIOCGETC, (char *)&otchars);
ioctl(0, (int)TIOCGLTC, (char *)&oltchars);
ioctl(0, (int)TIOCLGET, (char *)&olmode);
nstty = ostty;
ntchars = otchars;
nltchars = oltchars;
nlmode = olmode;
nstty.sg_flags = RAW; /* | = RAW; nstty.sg_flags &= ~ECHO; */
nstty.sg_erase = nstty.sg_kill = -1;
ntchars.t_intrc = ntchars.t_quitc = -1;
ntchars.t_eofc = ntchars.t_brkc = -1;
nltchars.t_suspc = nltchars.t_dsuspc = -1;
nltchars.t_rprntc = nltchars.t_flushc = -1;
nltchars.t_werasc = nltchars.t_lnextc = -1;
/* tell ourselves about it */
ioctl(0, (int)TIOCSETN, (char *)&nstty);
ioctl(0, (int)TIOCSETC, (char *)&ntchars);
ioctl(0, (int)TIOCSLTC, (char *)&nltchars);
ioctl(0, (int)TIOCLSET, (char *)&nlmode);
#else
tcgetattr( 0, &tios ); /* Get attributes for stdin */
temp_tios = tios; /* Make copy of tios for restoration */
temp =1;
tios.c_lflag &= ~ICANON; /* Disable canonical input */
tios.c_cc[VMIN] = 1; /* Read at least 1 character */
tios.c_cc[VTIME] = 0; /* Disable timeout */
tios.c_lflag &= ~ECHO; /* No echo */
tios.c_lflag &= ~ISIG; /* Disable input signals */
tios.c_cflag &= ~CSIZE;
tios.c_cflag |= CS8; /* 8 bit connection */
tios.c_cflag &= ~PARENB; /* No output parity */
tios.c_iflag &= ~INPCK; /* No input parity */
tios.c_iflag &= ~ISTRIP; /* Do not strip 8th bit */
tios.c_iflag &= ~IXON; /* Disable XON/XOFF */
tios.c_iflag &= ~IXOFF;
tios.c_iflag &= ~INLCR; /* No NL -> CR remapping */
tios.c_iflag &= ~ICRNL; /* No NL -> CR remapping */
tios.c_oflag &= ~OPOST; /* Disable output post processing */
tcsetattr( 0, TCSANOW, &tios );
timeout.tv_sec = 1;
timeout.tv_usec = 0;
#endif
fcntl( 0, F_SETFL, O_NDELAY ); /* Disable read blocking */
fcntl( fd, F_SETFL, O_NDELAY );
while( 1 )
{
FD_ZERO( &rd );
FD_SET( 0, &rd ); /* Determine whether 0 can be read */
FD_SET( fd, &rd ); /* Determine whether fd can be read */
FD_ZERO( &zer ); /* No write or exception queries */
if( select( NFDBITS, &rd, &zer, &zer, &timeout ) != -1 )
{
if( FD_ISSET( 0, &rd ) )
{ /* read zero */
result = read( 0, inbuf, BUFSIZE );
if( result > 0 )
{
write( fd, inbuf, result );
}
if( result < 0 )
{
printf( "\n\nEOF detected, exiting.\n" );
CleanUp( 0 );
}
}
if( FD_ISSET( fd, &rd ) )
{
result = read( fd, inbuf, BUFSIZE );
if( result > 0 )
write( 1, inbuf, result );
if( result < 0 )
{
printf( "\n\nERROR: Connection to server lost, quitting.\n" );
CleanUp(0);
}
}
}
}
}
int ConnectToServer( servername, port )
char *servername;
int port;
{
int sock;
struct hostent *host;
struct sockaddr_in serv;
printf( "Connecting to server %s port %ld.\n", servername, port );
sock = socket( AF_INET,SOCK_STREAM,0 );
if( sock < 0 )
{
fprintf( stderr, "irclink: Could not get socket.\n" );
return( -1 );
}
serv.sin_addr.s_addr = inet_addr( servername );
serv.sin_port = htons( port );
serv.sin_family = AF_INET;
if( serv.sin_addr.s_addr == INADDR_NONE )
{
if( host = (struct hostent *) gethostbyname( servername ) )
{
memcpy( &serv.sin_addr, host->h_addr, host->h_length );
}
else
{
fprintf( stderr, "irclink: Unknown host.\n" );
return( -1 );
}
}
if( connect( sock, (struct sockaddr *)&serv, sizeof( struct sockaddr_in ) ) == -1)
return( -1 );
else
return( sock );
}
main( argc, argv )
int argc;
char **argv;
{
char buf[2];
char *cmdarg;
char *servername;
int sock;
int port;
port = 6667;
temp = 0;
if( argv[1] )
servername = argv[1];
else
{
printf( "Usage 2: %s server [port]\n", argv[0] );
exit( 1 );
}
if( argv[2] )
port = atoi( argv[2] );
sock = ConnectToServer( servername, port );
if( sock < 0 )
{
fprintf( stderr, "irclink: Could not connect to server.\n" );
exit( 5 );
}
printf( "Connected to server %s.\n", servername );
HandleIO( sock );
CleanUp( 0 ); /* make sure to clean up */
return( 0 );
}
EOFIRCLINK
if [ -f /usr/include/termios.h ] ; then
if [ -f /usr/include/sys/aixgsc.h ] ; then
$ccomp -DAIX -o irclink irclink-out.c $cflags
else
$ccomp -o irclink irclink-out.c $cflags
fi
else
$ccomp -DCF_SGTTY -o irclink irclink-out.c $cflags
fi
rm irclink-out.c